#!/bin/bash

# B站弹幕机 JMeter 自动化测试脚本
# 作者: AI Assistant
# 版本: 1.0

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 配置变量
PROJECT_NAME="B站弹幕机"
PROJECT_PORT=23333
PROJECT_URL="http://localhost:${PROJECT_PORT}"
JMETER_PLAN="jmeter_test_plan.jmx"
TEST_RESULTS="test_results.jtl"
TEST_REPORT_DIR="test_report"
LOG_FILE="test_execution.log"

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1" | tee -a $LOG_FILE
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a $LOG_FILE
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a $LOG_FILE
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1" | tee -a $LOG_FILE
}

# 检查依赖
check_dependencies() {
    log_info "检查系统依赖..."
    
    # 检查Java
    if ! command -v java &> /dev/null; then
        log_error "Java未安装，请先安装Java 8或更高版本"
        exit 1
    fi
    
    # 检查JMeter
    if ! command -v jmeter &> /dev/null; then
        log_error "JMeter未安装，请先安装Apache JMeter"
        exit 1
    fi
    
    # 检查Gradle
    if ! command -v ./gradlew &> /dev/null; then
        log_error "Gradle wrapper不存在，请确保在项目根目录执行"
        exit 1
    fi
    
    log_success "所有依赖检查通过"
}

# 检查端口占用
check_port() {
    log_info "检查端口 ${PROJECT_PORT} 占用情况..."
    
    if lsof -Pi :$PROJECT_PORT -sTCP:LISTEN -t >/dev/null ; then
        log_warning "端口 ${PROJECT_PORT} 已被占用，尝试停止占用进程..."
        lsof -ti:$PROJECT_PORT | xargs kill -9
        sleep 2
    fi
    
    log_success "端口 ${PROJECT_PORT} 可用"
}

# 启动项目
start_project() {
    log_info "启动 ${PROJECT_NAME} 项目..."
    
    # 构建项目
    log_info "构建项目..."
    ./gradlew build -x test
    
    # 启动项目
    log_info "启动项目..."
    nohup java -jar build/libs/danmuji-2.7.0.2.jar > project.log 2>&1 &
    PROJECT_PID=$!
    
    # 等待项目启动
    log_info "等待项目启动..."
    for i in {1..30}; do
        if curl -s $PROJECT_URL > /dev/null; then
            log_success "项目启动成功，PID: $PROJECT_PID"
            return 0
        fi
        sleep 1
    done
    
    log_error "项目启动超时"
    return 1
}

# 执行JMeter测试
run_jmeter_test() {
    log_info "开始执行JMeter测试..."
    
    # 检查JMeter测试计划文件
    if [ ! -f "$JMETER_PLAN" ]; then
        log_error "JMeter测试计划文件不存在: $JMETER_PLAN"
        return 1
    fi
    
    # 执行测试
    log_info "执行测试计划: $JMETER_PLAN"
    jmeter -n -t $JMETER_PLAN -l $TEST_RESULTS -e -o $TEST_REPORT_DIR
    
    if [ $? -eq 0 ]; then
        log_success "JMeter测试执行完成"
        log_info "测试结果文件: $TEST_RESULTS"
        log_info "测试报告目录: $TEST_REPORT_DIR"
    else
        log_error "JMeter测试执行失败"
        return 1
    fi
}

# 分析测试结果
analyze_results() {
    log_info "分析测试结果..."
    
    if [ ! -f "$TEST_RESULTS" ]; then
        log_warning "测试结果文件不存在，跳过分析"
        return
    fi
    
    # 统计基本信息
    TOTAL_REQUESTS=$(wc -l < $TEST_RESULTS)
    SUCCESS_REQUESTS=$(grep -c "true" $TEST_RESULTS || echo "0")
    FAILED_REQUESTS=$(grep -c "false" $TEST_RESULTS || echo "0")
    
    log_info "测试统计:"
    log_info "  总请求数: $TOTAL_REQUESTS"
    log_info "  成功请求数: $SUCCESS_REQUESTS"
    log_info "  失败请求数: $FAILED_REQUESTS"
    
    # 计算成功率
    if [ $TOTAL_REQUESTS -gt 0 ]; then
        SUCCESS_RATE=$(echo "scale=2; $SUCCESS_REQUESTS * 100 / $TOTAL_REQUESTS" | bc)
        log_info "  成功率: ${SUCCESS_RATE}%"
    fi
    
    # 生成简单报告
    cat > test_summary.txt << EOF
B站弹幕机 JMeter 测试报告
========================

测试时间: $(date)
测试环境: $(hostname)
项目版本: 2.7.0.2

测试统计:
- 总请求数: $TOTAL_REQUESTS
- 成功请求数: $SUCCESS_REQUESTS
- 失败请求数: $FAILED_REQUESTS
- 成功率: ${SUCCESS_RATE}%

详细报告请查看: $TEST_REPORT_DIR/index.html
EOF
    
    log_success "测试分析完成，报告已生成: test_summary.txt"
}

# 清理资源
cleanup() {
    log_info "清理测试资源..."
    
    # 停止项目
    if [ ! -z "$PROJECT_PID" ]; then
        log_info "停止项目进程 (PID: $PROJECT_PID)"
        kill $PROJECT_PID 2>/dev/null || true
    fi
    
    # 清理临时文件
    rm -f project.log
    
    log_success "资源清理完成"
}

# 主函数
main() {
    log_info "开始执行 ${PROJECT_NAME} JMeter 自动化测试"
    log_info "测试时间: $(date)"
    
    # 创建日志文件
    > $LOG_FILE
    
    # 设置错误处理
    trap cleanup EXIT
    
    # 执行测试流程
    check_dependencies
    check_port
    start_project
    run_jmeter_test
    analyze_results
    
    log_success "所有测试执行完成！"
    log_info "查看详细报告: $TEST_REPORT_DIR/index.html"
    log_info "查看测试日志: $LOG_FILE"
}

# 帮助信息
show_help() {
    echo "B站弹幕机 JMeter 自动化测试脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -h, --help     显示帮助信息"
    echo "  -c, --clean    仅清理资源"
    echo "  -t, --test     仅执行测试（不启动项目）"
    echo ""
    echo "示例:"
    echo "  $0             执行完整测试流程"
    echo "  $0 -c          清理测试资源"
    echo "  $0 -t          仅执行JMeter测试"
}

# 解析命令行参数
case "${1:-}" in
    -h|--help)
        show_help
        exit 0
        ;;
    -c|--clean)
        cleanup
        exit 0
        ;;
    -t|--test)
        run_jmeter_test
        analyze_results
        exit 0
        ;;
    "")
        main
        ;;
    *)
        log_error "未知参数: $1"
        show_help
        exit 1
        ;;
esac 